const db = require("../db/index.js");

// 导入bcrypt加密中间件
const bcrypt = require("bcrypt")
// 导入jwt，用于生产token
const jwt = require("jsonwebtoken");
// 导入jwt配置，用于加密跟解密
const jwtconfig = require("../jwt_config/index.js")

exports.register = (req, res)=>{
	//req是前端传的数据，也就是request，res是后端返回给前端的数据，也就是result
	const reginfo = req.body;
	// 第一步，判断前端传的账号或者密码是否为空
	if(!reginfo.account || !reginfo.password){
		return res.send({
			status:1,
			message:"账号或者密码不能为空"
		})
	}
	// 第二步，判断前端传的账号数据库是否存在
	// 需要使用mysql的select语句
	const sql = "select * from users where account = ?"
	// 第一个参数是执行语句，第二个是参数，第三个是函数，用于处理结果
	db.query(sql,reginfo.account,(err,results)=>{
		if(results.length>0){
			return res.send({
				status:1,
				message:"账号已经存在"
			})
		}
		// 第三步，对密码进行加密
		// 使用加密中间件bcrypt.js
		// 第一个是传入的密码，第二个是加密的长度
		reginfo.password = bcrypt.hashSync(reginfo.password,10)
		// 第四步，把账号跟密码插入到users表里面
		const sql1 = "insert into users set ?"
		// 身份
		const identity = "用户"
		// 创建时间
		const create_time = new Date();
		db.query(sql1,{
			account:reginfo.account,
			password:reginfo.password,
			// 身份
			identity,
			// 创建时间
			create_time,
			// 初始未冻结状态为0
			status:0,
		},(err,results)=>{
			// 第一个，插入失败
			console.log(results)
			console.log(err)
			// affectedRows为影响的行数，如果插入失败，那么没有影响到行数，也就是行数不为1
			if(results.affectedRows !== 1){
				return res.send({
					status:1,
					message:"注册账号失败"
				})
			}
			res.send({
				status:1,
				message:"注册账号成功"
			})
		})
	})
}

exports.login = (req, res)=>{
	const loginfo = req.body;
	// 第一步，查看数据表中有没有前端传来的账号
	const sql = "select * from users where account = ?"
	db.query(sql,loginfo.account,(err,results)=>{
		// 执行sql语句失败的情况，一般在数据库断开的情况会执行失败
		if(err) return res.cc(err)
		// 查询不到账号信息
		if(results.length !== 1) return res.cc("账号不存在")
		// 第二步，对前端传来的密码进行解密
		const compareResults = bcrypt.compareSync(loginfo.password,results[0].password)
		if(!compareResults){
			return res.cc("密码错误")
		}
		// 判断账号是否被冻结
		if(results[0].status==1){
			return res.cc("账号被冻结")
		}
		// 第四步，生产返回给前端的token
		// 剔除加密后的密码，头像，图像，创建时间，更新时间
		const user = {
			...results[0],
			password:"",
			imagesUrl:"",
			create_time:"",
			update_time:"",
		}
		// 设置token的有效时长，有效期为7个小时
		const tokenStr = jwt.sign(user,jwtconfig.jwtSecretKey,{
			expiresIn:"7h"
		})
		res.send({
			results:results[0],
			status:0,
			message:"登录成功",
			token:"Bearer " + tokenStr
		})
	})
}